Еще один немаловажный файл для настройки кликхаус сервера - это users.xml, который лежит в директории /etc/clickhouse-server/. В нем можно добавить пользователей, настроить для них профили и квоты. Но в этом задании мы начнем с создания пользователей.
Структура конфигурации пользователей выглядит следующим образом:
<yandex>
<users>
<user_name>
<password></password>
<!-- Или -->
<password_sha256_hex></password_sha256_hex>
<access_management>0|1</access_management>
<networks incl="networks" replace="replace">
<ip>::1</ip>
<ip>0.0.0.0</ip>
<host>host.example.com</host>
<host_regexp>.*\.example\.com$</host_regexp>
</networks>
<profile>profile_name</profile>
<quota>default</quota>
<databases>
<database_name>
<table_name>
<filter>role = 'user'</filter>
<table_name>
</database_name>
</databases>
</user_name>
</users>
</yandex>
Имя пользователя. Если оно не указано, то будет использоваться пользователь default.
Пароль пользователя. Может быть пустым. Пароли хранятся либо в текстовом варианте, либо в хэшированом (sha256, double_sha1). Мы рекомендуем использовать хешированный вариант записи, чтобы при получении доступа к серверу было невозможно прочитать конфигурационный файл и получить пароль в открытом виде.
Параметр, который отвечает за управление доступом для пользователя, подобно MySQL. По факту разрешает данному пользователю управление другими пользователями. По-умолчанию данная опция выключена (0).
Список сетей, из которых пользователь может подключиться к ClickHouse. Обычно доступ пользователям разрешается со всех айпи адресов, поскольку безопасность по сети регулируются ее приватностью и настройкой фаервола. То есть мы советуем выделять кластер кликхауса в отдельуню приватную сеть с запретом доступа всем, кроме разрешенных хостов, а для разработчиков и административных пользователей советуем использовать VPN.
Профиль для указаного пользователя. Профили конфигурируются в отдельной секции файла users.xml. Их мы рассмотрим в следующем задании.
Квоты для указанного пользователя. Квоты конфигурируются в отдельной секции файла users.xml. Их мы так же рассмотрим в следующем задании.
Позволяет ограничить выдачу данных запросом SELECT для пользователя. Этот параметр содержит список баз и таблиц (database_name и table_name в примере), к которым будут применяться ограничения. Параметр filter содержать выражение любого вида, которое возвращает число. Строки в ответе на запрос, для которых фильтр возвращает 0 не будут отображаться в конечном запросе.
Давайте попробуем создать нашего пользователя и попробовать настроить для него фильтрацию строк из нашей таблицы. Для начала создадим таблицу и занесем в нее некоторые данные:
ch1.ru-central1.internal :) create database logs;
ch1.ru-central1.internal :) create table logs.data (ev DateTime, a Int, role String) ENGINE MergeTree PARTITION BY toYYYYMM(ev) ORDER BY ev;
ch1.ru-central1.internal :) insert into logs.data values ('2021-03-09T12:00:00', 1, 'admin');
ch1.ru-central1.internal :) insert into logs.data values ('2021-03-09T12:01:00', 2, 'user');
ch1.ru-central1.internal :) insert into logs.data values ('2021-03-09T12:02:00', 3, 'test');
ch1.ru-central1.internal :) select * from data;
┌──────────────────ev─┬─a─┬─role──┐
│ 2021-03-09 12:00:00 │ 1 │ admin │
└─────────────────────┴───┴───────┘
┌──────────────────ev─┬─a─┬─role─┐
│ 2021-03-09 12:01:00 │ 2 │ user │
└─────────────────────┴───┴──────┘
┌──────────────────ev─┬─a─┬─role─┐
│ 2021-03-09 12:02:00 │ 3 │ test │
└─────────────────────┴───┴──────┘
3 rows in set. Elapsed: 0.003 sec.
ch1.ru-central1.internal :)
Итак, в начале мы создали базу данных logs, а потом таблицу data внутри этой базы. Таблица у нас достаточно простая и содержит всего лишь три колонки - время события, числовое значение события и role - строку. После создания мы сразу же добавили три строки в нашу таблицу.
Давайте теперь создадим пользователя test без пароля и попробуем разрешить ему выводить строки только с типом role = test:
<test>
<password></password>
<access_management>0</access_management>
<networks incl="networks" replace="replace">
<ip>0.0.0.0/0</ip>
</networks>
<profile>default</profile>
<quota>default</quota>
<databases>
<logs>
<data>
<filter>role = 'test'</filter>
</data>
</logs>
</databases>
</test>
И теперь попробуем от его имени посмотреть данные в таблице logs.data:
root@ch1:/etc/clickhouse-server# clickhouse-client -u test
ch1.ru-central1.internal :) use logs;
ch1.ru-central1.internal :) select * from data;
┌──────────────────ev─┬─a─┬─role─┐
│ 2021-03-09 12:02:00 │ 3 │ test │
└─────────────────────┴───┴──────┘
1 rows in set. Elapsed: 0.003 sec.
ch1.ru-central1.internal :)
Отлично! Кликхаус выдал нам только одну строку, которая соответствует нашему условию!
users.xmlch_user.ch_password